7-5 hX

曲線擬合(Curve Fitting)是在資料分析上常用的方法,其基本概念乃是以一參數化的曲線來逼近一組給定的資料點。若此參數化的曲線是一個多項式,則此種曲線擬合又稱為多項式擬合(Polynomial Fitting)。MATLAB 提供了 polyfit 指令以進行多項式擬合,使用非常容易。

例如:以下為美國人口在 1790至 1990(10 年一期)的資料:

Example 1: 07-多項式的處理與分析/plotCensus.mload census.mat plot(cdate, pop, 'o'); xlabel('年份'); ylabel('人口(單位:百萬)');

若欲預測美國在西元 2002 年的總人口,可用 polyfit 來找出一條多項式以逼近已知的資料點。假設此多項式的次數為 3,則可輸入如下:

Example 2: 07-多項式的處理與分析/polyfit01.mwarning off % 刪除此列將可顯示警告訊息 load census.mat plot(cdate, pop, 'o'); p3 = polyfit(cdate, pop, 3); cdate2 = 1790:2002; pop2 = polyval(p3, cdate2); plot(cdate, pop, 'o', cdate2, pop2, '-'); xlabel('年份'); ylabel('人口(單位:百萬)'); legend('實際人口', '預測人口'); popAt2002 = polyval(p3, 2002)popAt2002 = 282.5332

由此曲線預測可知在 2002 年的美國人口約為 282.5 百萬人。

由不同的次數來進行多項式擬合,在「外插」(Extrapolation)時,得到的差異相當大。我們可將其結果畫在同一張圖上,以方便進行比較。如下:

Example 3: 07-多項式的處理與分析/polyfit02.mwarning off % 刪除此列將可顯示警告訊息 load census.mat cdate2 = min(cdate):(max(cdate)+30); curve = zeros(7, length(cdate2)); for i = 1:7 curve(i,:) = polyval(polyfit(cdate,pop,i), cdate2); end plot(cdate, pop,'o', cdate2, curve); legend('實際資料', 'order=1', 'order=2','order=3', 'order=4', 'order=5', 'order=6', 'order=7'); xlabel('年份'); ylabel('人口(單位:百萬)');

請注意,多項式的次數越高,越能逼近所給定的資料。以上述 21 點資料為例,若我們用 20 次的多項式來逼近,則此多項式會通過每一個資料點。(為什麼?)但這並不表示預測的準確度會提高。高次多項式對雜訊(Noise)的敏感度較高,因此容易產生不準確的外插預測。(讀者若在 MATLAB 嘗試此範例,所畫出的圖是彩色的,比較容易看出每條曲線的差異。)

同時,在上述範例中,常會出現 MATLAB 的警告訊息(請將上述兩範例中的 warning off 刪除,即可看到警告訊息),這是表示由於實際資料的不足或由於資料數值範圍的過大或過小,造成在進行多項式擬合時,可能會帶來數值上的誤差。因此在進行多項式擬合時,我們最好先將資料進行必要的平移、放大或縮小範圍,相關資訊請由「help polyfit」即可得到相關的線上支援。

Hint
在MATLAB 的示範程式 census.m 中,有針對上述美國人口資料的各種曲線擬合方法,您若有興趣,不妨輸入「showdemo census.m」試試看!

其它有關內插與曲線擬合的方法,請參見本書「曲線擬合與迴歸分析」之相關章節。


MATLAB程式設計:進階篇